package blbetter.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

public class BLDataBaseSQL implements BLDataBase {

	public Connection conn;

	private PreparedStatement getLetzNPStmt;

	// private PreparedStatement getSpieleBySaison;

	public BLDataBaseSQL() {
		try {
			Class.forName("org.postgresql.Driver");
			conn = DriverManager.getConnection(
					"jdbc:postgresql://localhost/Bundesliga", "postgres",
					"100titten");
			String sql = "SELECT \"heimId\",\"gastId\",\"heimTore\",\"gastTore\",\"saisonId\",spieltag FROM \"Spiele\" WHERE (\"heimId\" = ? OR \"gastId\" = ?) AND (\"saisonId\" < ? OR (\"saisonId\" = ? AND spieltag < ?)) ORDER BY \"saisonId\" DESC, spieltag DESC LIMIT ?";
			getLetzNPStmt = conn.prepareStatement(sql);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	protected boolean execute(String sql) {
		try {
			Statement st = conn.createStatement();
			return st.execute(sql);
		} catch (SQLException e) {
			System.err.println("BLDataBase.execute(): query = " + sql);
			e.printStackTrace();
			return false;
		}
	}

	protected ResultSet executeQuery(String sql) {
		try {
			Statement st = conn.createStatement();
			ResultSet rs = st.executeQuery(sql);
			return rs;
		} catch (SQLException e) {
			System.err.println("BLDataBase.executeQuery(): query = " + sql);
			e.printStackTrace();
			return null;
		}
	}

	public boolean addSaison(int jahr1, int jahr2) {
		System.out.println("ADD SAISON " + jahr1 + "/" + jahr2);
		String sql = "INSERT INTO \"Saisons\"(jahr1, jahr2) VALUES (" + jahr1
				+ "," + jahr2 + ")";
		return execute(sql);
	}

	public boolean addTeam(String name) {
		System.out.println("ADD TEAM " + name);
		String sql = "INSERT INTO \"Teams\"(name) VALUES ('" + name + "')";
		return execute(sql);
	}

	public boolean addSpiel(int heimId, int gastId, int heimTore, int gastTore,
			int spieltag, int saisonId) {
		String sql = "INSERT INTO \"Spiele\"(\"heimId\", \"gastId\", \"heimTore\", \"gastTore\", spieltag, \"saisonId\") VALUES (?, ?, ?, ?, ?, ?)";
		sql = sql.replaceFirst("\\?", "" + heimId);
		sql = sql.replaceFirst("\\?", "" + gastId);
		sql = sql.replaceFirst("\\?", "" + heimTore);
		sql = sql.replaceFirst("\\?", "" + gastTore);
		sql = sql.replaceFirst("\\?", "" + spieltag);
		sql = sql.replaceFirst("\\?", "" + saisonId);
		return execute(sql);
	}

	public int getTeamId(String name) {
		String sql = "SELECT \"teamId\" FROM \"Teams\" WHERE name = '" + name
				+ "' LIMIT 1";
		try {
			ResultSet rs = executeQuery(sql);
			rs.next();
			return rs.getInt(1);
		} catch (SQLException e) {
			System.err.println("BLDataBase.getTeamId(): query = " + sql);
			e.printStackTrace();
			return -1;
		}
	}

	public String getTeamName(int teamId) {
		String sql = "SELECT \"name\" FROM \"Teams\" WHERE \"teamId\" = "
				+ teamId + " LIMIT 1";
		try {
			ResultSet rs = executeQuery(sql);
			rs.next();
			return rs.getString(1);
		} catch (SQLException e) {
			System.err.println("BLDataBase.getTeamName(): query = " + sql);
			e.printStackTrace();
			return "none";
		}
	}

	public int getSaisonIdByJahr1(int jahr1) {
		String sql = "SELECT \"saisonId\" FROM \"Saisons\" WHERE jahr1 = "
				+ jahr1 + " LIMIT 1";
		try {
			ResultSet rs = executeQuery(sql);
			rs.next();
			return rs.getInt(1);
		} catch (SQLException e) {
			System.err.println("BLDataBase.getSaisonIdByJahr1(): query = "
					+ sql);
			e.printStackTrace();
			return -1;
		}
	}

	public int getJahr1BySaisonId(int saisonId) {
		String sql = "SELECT jahr1 FROM \"Saisons\" WHERE \"saisonId\" = "
				+ saisonId + " LIMIT 1";
		try {
			ResultSet rs = executeQuery(sql);
			rs.next();
			return rs.getInt(1);
		} catch (SQLException e) {
			System.err.println("BLDataBase.getJahr1BySaisonId(): query = "
					+ sql);
			e.printStackTrace();
			return -1;
		}
	}

	public Vector<Spiel> getSpieleBySaisonIdAndSpieltag(int saisonId,
			int spieltag) {
		Vector<Spiel> spiele = new Vector<Spiel>();
		String sql = "SELECT \"heimId\",\"gastId\",\"heimTore\",\"gastTore\" FROM \"Spiele\" WHERE \"saisonId\" = "
				+ saisonId + " AND spieltag = " + spieltag;
		// System.out.println(sql);
		try {
			ResultSet rs = executeQuery(sql);
			while (rs.next()) {
				int heimId = rs.getInt(1);
				int gastId = rs.getInt(2);
				int heimTore = rs.getInt(3);
				int gastTore = rs.getInt(4);
				spiele.add(new Spiel(heimId, gastId, heimTore, gastTore,
						saisonId, spieltag));
			}
		} catch (SQLException e) {
			System.err
					.println("BLDataBase.getSpieleBySaisonIdAndSpieltag(): query = "
							+ sql);
			e.printStackTrace();
		}
		return spiele;
	}

	@Override
	public Vector<Spiel> getSpieleBySaisonIdAndToSpieltag(int saisonId,
			int spieltag) {
		Vector<Spiel> spiele = new Vector<Spiel>();
		String sql = "SELECT \"heimId\",\"gastId\",\"heimTore\",\"gastTore\" FROM \"Spiele\" WHERE \"saisonId\" = "
				+ saisonId + " AND spieltag <= " + spieltag;
		// System.out.println(sql);
		try {
			ResultSet rs = executeQuery(sql);
			while (rs.next()) {
				int heimId = rs.getInt(1);
				int gastId = rs.getInt(2);
				int heimTore = rs.getInt(3);
				int gastTore = rs.getInt(4);
				spiele.add(new Spiel(heimId, gastId, heimTore, gastTore,
						saisonId, spieltag));
			}
		} catch (SQLException e) {
			System.err
					.println("BLDataBase.getSpieleBySaisonIdAndSpieltag(): query = "
							+ sql);
			e.printStackTrace();
		}
		return spiele;
	}

	public Vector<Spiel> getSpieleSinceSaison(int saisonId) {
		Vector<Spiel> spiele = new Vector<Spiel>();
		String sql = "SELECT * FROM \"Spiele\" WHERE \"saisonId\" >= "
				+ saisonId;
		// System.out.println(sql);
		try {
			ResultSet rs = executeQuery(sql);
			while (rs.next()) {
				int heimId = rs.getInt("heimId");
				int gastId = rs.getInt("gastId");
				int heimTore = rs.getInt("heimTore");
				int gastTore = rs.getInt("gastTore");
				int tsaisonId = rs.getInt("saisonId");
				int tspieltag = rs.getInt("spieltag");
				spiele.add(new Spiel(heimId, gastId, heimTore, gastTore,
						tsaisonId, tspieltag));
			}
		} catch (SQLException e) {
			System.err
					.println("BLDataBase.getSpieleBySaisonIdAndSpieltag(): query = "
							+ sql);
			e.printStackTrace();
		}
		return spiele;
	}

	public Vector<Spiel> getSpieleAbSaisonBisSaisonSpieltag(int abSaisonId,
			int bisSaisonId, int bisSpieltagLetzteSaison) {
		Vector<Spiel> spiele = new Vector<Spiel>();
		String sql = "SELECT * FROM \"Spiele\" WHERE " + "(\"saisonId\" >= "
				+ abSaisonId + " AND \"saisonId\" < " + bisSaisonId + ") "
				+ "OR " + "(\"saisonId\" = " + bisSaisonId
				+ " AND \"spieltag\" <= " + bisSpieltagLetzteSaison + ") ";
		// System.out.println(sql);
		try {
			ResultSet rs = executeQuery(sql);
			while (rs.next()) {
				int heimId = rs.getInt("heimId");
				int gastId = rs.getInt("gastId");
				int heimTore = rs.getInt("heimTore");
				int gastTore = rs.getInt("gastTore");
				int tsaisonId = rs.getInt("saisonId");
				int tspieltag = rs.getInt("spieltag");
				spiele.add(new Spiel(heimId, gastId, heimTore, gastTore,
						tsaisonId, tspieltag));
			}
		} catch (SQLException e) {
			System.err
					.println("BLDataBase.getSpieleBySaisonIdAndSpieltag(): query = "
							+ sql);
			e.printStackTrace();
		}
		return spiele;
	}

	public Vector<Spiel> getLetzteNSpieleByTeam(int teamId, int anzSpiele,
			int saisonId, int spieltag) {
		Vector<Spiel> spiele = new Vector<Spiel>();
		try {
			getLetzNPStmt.setInt(1, teamId);
			getLetzNPStmt.setInt(2, teamId);
			getLetzNPStmt.setInt(3, saisonId);
			getLetzNPStmt.setInt(4, saisonId);
			getLetzNPStmt.setInt(5, spieltag);
			getLetzNPStmt.setInt(6, anzSpiele);

			// System.out.println(sql);

			ResultSet rs = getLetzNPStmt.executeQuery();
			while (rs.next()) {
				int heimId = rs.getInt(1);
				int gastId = rs.getInt(2);
				int heimTore = rs.getInt(3);
				int gastTore = rs.getInt(4);
				int tsaisonId = rs.getInt(5);
				int tspieltag = rs.getInt(6);
				spiele.add(new Spiel(heimId, gastId, heimTore, gastTore,
						tsaisonId, tspieltag));
			}
		} catch (SQLException e) {
			System.err.println("BLDataBase.getLetzteNSpieleByTeam(): stmt = "
					+ getLetzNPStmt);
			e.printStackTrace();
		}
		return spiele;
	}

	public Vector<String> getSaisons() {
		String sql = "SELECT * FROM \"Saisons\" ORDER BY jahr1 DESC";
		Vector<String> saisons = new Vector<String>();
		try {
			ResultSet rs = executeQuery(sql);
			while (rs.next()) {
				saisons.add(rs.getString("jahr1") + "/" + rs.getString("jahr2"));
			}
		} catch (SQLException e) {
			System.err
					.println("BLDataBase.getSpieleBySaisonIdAndSpieltag(): query = "
							+ sql);
			e.printStackTrace();
		}
		return saisons;
	}

}
